/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.sessionService;

import br.com.ecommerce.entity.impl.CallOnAvaliable;
import br.com.ecommerce.entity.impl.Categoria;
import br.com.ecommerce.entity.impl.Produto;
import br.com.ecommerce.util.ejb.AbstractService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

/**
 *
 * @author rpateixeira
 */
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ProdutoServiceSession extends AbstractService<Produto>{

    @Override
    public Produto insert(Produto t) {
        t.getCategoria().addProduto(t);
        return super.insert(t);
    }


    public List<Produto> findProdutosByName(String nomeProduto){
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("productName", nomeProduto+"%");
        return persistence.findByNamed("Produto.findProdutosByName", args);
    }

    public List<Produto>findProdutosLowStock(){
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("quantidadeMinima", 10);
        args.put("ativo",true);
        return persistence.find("SELECT oEntidade FROM "+getEntityType().getSimpleName()+" oEntidade where oEntidade.stock <= :quantidadeMinima and oEntidade.categoria.active =:ativo", args);
    }

    public List<Produto>findProdutosHighStock(){
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("quantidadeMaxima", 30);
          return persistence.find("SELECT oEntidade FROM "+getEntityType().getSimpleName()+" oEntidade where oEntidade.stock >= :quantidadeMaxima ", args);
    }

    public List<Categoria> findAllCategorias(){
        return persistence.find("SELECT cat FROM Categoria cat order by cat.nome", null);
    }
    public List<Categoria> findAllCategoriasAtivas(){
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("ativo", true);
        return persistence.find("SELECT cat FROM Categoria cat where cat.active=:ativo order by cat.nome", args);
    }
    public Categoria findCategoriaById(Long id){
        return persistence.getPojo(Categoria.class, id);
    }
    public Categoria insertCategoria(Categoria categoria){
        return persistence.insert(categoria);
    }
    public Categoria updateCategoria(Categoria categoria){
        return persistence.update(categoria);
    }
    public void removeCategoria(Categoria categoria){
        persistence.remove(categoria);
    }

    public CallOnAvaliable addNotifiableUsuarioOnAvaliable(String email,Produto produto){
        CallOnAvaliable toPersist = new CallOnAvaliable();
        toPersist.setEmail(email);
        toPersist.setProduto(produto);
        toPersist=persistence.insert(toPersist);
        return toPersist;
    }

    @Schedule(minute="30")
    public void callTheUsersOnProductAvalible(){
        
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("estoque", 0);
        args.put("called", false);
        List<CallOnAvaliable> toCall= persistence.find("SELECT call FROM CallOnAvaliable call where call.produto.stock > :estoque "
                                      + "and call.called =:called", args);
        System.out.println("Start Callers Check");
        for (CallOnAvaliable callOnAvaliable : toCall) {
            System.out.println("You need to call "+callOnAvaliable.getEmail());
            callOnAvaliable.setCalled(true);
        
        }
        System.out.println("END Callers Check");
    }

    public  int callTheUsersOnProductAvalibleTest(){
        int called=0;
        Map<String,Object> args = new HashMap<String, Object>();
        args.put("estoque", 0);
        args.put("called", false);
        List<CallOnAvaliable> toCall= persistence.find("SELECT call FROM CallOnAvaliable call where call.produto.stock > :estoque "
                                      + "and call.called =:called", args);
        System.out.println("Start Callers Check");
        for (CallOnAvaliable callOnAvaliable : toCall) {
            System.out.println("You need to call "+callOnAvaliable.getEmail());
            callOnAvaliable.setCalled(true);
           called++;
        }
        System.out.println("END Callers Check");
        return called;
    }
}
